/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.np2tec.soa.servicos;

import br.np2tec.soa.entidades.CreditosConcedidos;
import br.np2tec.soa.entidades.Parcela;
import br.np2tec.soa.entidades.PropostaCredito;
import br.np2tec.soa.entidades.TaxaJuros;
import java.util.List;
import javax.jws.WebService;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;
import javax.xml.ws.WebServiceRef;

/**
 *
 * @author np2tec-07
 */
@WebService()
@Stateless()
public class TratarCreditosConcedidosDataService {

    @WebServiceRef(wsdlLocation = "http://localhost:8080/TratarPropostaCreditoDataServiceService/TratarPropostaCreditoDataService?WSDL")
    TratarPropostaCreditoDataServiceService tratarPropostaCreditoService;
    @PersistenceContext(unitName = "TratarCreditosConcedidosDataServicePU")
    EntityManager em;


    public void incluirCreditosConcedidos(Double valorTotalConcedido, Integer numeroParcelas, String situacao, List<Parcela> parcelas, Long numeroPropostaCredito) {

        CreditosConcedidos creditosConcedidos = new CreditosConcedidos();
        creditosConcedidos.setNumeroParcelas(numeroParcelas);

        br.np2tec.soa.servicos.PropostaCredito propostaCredito = tratarPropostaCreditoService.getTratarPropostaCreditoDataServicePort().consultarPropostaCredito(numeroPropostaCredito);
        PropostaCredito proposta = new PropostaCredito();

        proposta.setId(propostaCredito.getId());

        creditosConcedidos.setPropostaCredito(proposta);
        creditosConcedidos.setSituacao(situacao);
        creditosConcedidos.setValorTotalConcedido(valorTotalConcedido);
        creditosConcedidos.addParcelas(parcelas);

        try {
            em.persist(creditosConcedidos);
        } catch (Exception e) {
            e.printStackTrace();
        }


    }

    public void alterarCreditosConcedidos(Long numeroPropostaCredito, String situacao, TaxaJuros juros, Double valorTotalConcedido, Integer numeroParcelas, List<Parcela> parcelas) {

        CreditosConcedidos creditosConcedidos = consultarCreditosConcedidos(numeroPropostaCredito);

        if (situacao != null) {
            creditosConcedidos.setSituacao(situacao);
        }


        if (juros != null) {
            creditosConcedidos.setTaxaJuros(juros);
        }



        if (valorTotalConcedido != null) {
            creditosConcedidos.setValorTotalConcedido(valorTotalConcedido);
        }

        if (numeroParcelas != null) {
            creditosConcedidos.setNumeroParcelas(numeroParcelas);
        }

        creditosConcedidos.setParcelas(parcelas);

        em.merge(creditosConcedidos);
    }


    public CreditosConcedidos consultarCreditosConcedidos(Long numeroPropostaCredito) {
        Query query = em.createQuery("SELECT cc FROM CreditosConcedidos cc WHERE cc.propostaCredito.numeroProposta = :numeroProposta");
        query.setParameter("numeroProposta", numeroPropostaCredito);
        CreditosConcedidos creditosConcedidos = (CreditosConcedidos) query.getSingleResult();
        return creditosConcedidos;
    }


    public void excluirCreditosConcedidos(Long numeroPropostaCredito) {
        CreditosConcedidos creditosConcedidos = consultarCreditosConcedidos(numeroPropostaCredito);
        em.remove(creditosConcedidos);
    }


    public CreditosConcedidos consultarCreditosConcedidosPorIdPropostaCredito(Long idPropostaCredito) {
        Query query = em.createQuery("SELECT cc FROM CreditosConcedidos cc WHERE cc.propostaCredito.id = :id");
        query.setParameter("id", idPropostaCredito);
        CreditosConcedidos creditosConcedidos = (CreditosConcedidos) query.getSingleResult();
        return creditosConcedidos;
    }


    public List<CreditosConcedidos> consultarCreditosConcedidosPorCliente(String cpfCliente) {
        Query query = em.createQuery("SELECT cc FROM CreditosConcedidos cc WHERE cc.propostaCredito.cliente.cpf = :cpfCliente");
        query.setParameter("cpfCliente", cpfCliente);
        List<CreditosConcedidos> listaCreditosConcedidos = (List<CreditosConcedidos>) query.getResultList();
        return listaCreditosConcedidos;
    }


    public List<CreditosConcedidos> listarCreditosConcedidos(Long numeroPropostaCredito) {
        Query query = em.createQuery("SELECT cc FROM CreditosConcedidos cc WHERE cc.propostaCredito.numeroProposta = :numeroProposta");
        query.setParameter("numeroProposta", numeroPropostaCredito);
        return query.getResultList();
    }

    /**
     * Veriica as parcelas que não foram pagas
     * @return a quantidade de parcelas não pagas
     */

    public int verificarParcelasEmAberto(List<Parcela> parcelas) {
        int qtdParcelasAbertas = 0;
        for (Parcela parcela : parcelas) {
            if (parcela.getDataPagamento() == null) {
                qtdParcelasAbertas++;
            }
        }
        return qtdParcelasAbertas;
    }


    public void incluirTaxaJuros(String codigoTaxa, Double valorTotalMinimo, Double valorTotalMaximo, Integer numeroParcelasMinimo, Integer numeroParcelasMaximo, Double valorTaxaJuros) {

        if (valorTaxaJuros <= 0.12) {
            TaxaJuros taxaJuros = new TaxaJuros();
            taxaJuros.setCodigoTaxa(codigoTaxa);
            taxaJuros.setNumeroParcelasMaximo(numeroParcelasMaximo);
            taxaJuros.setNumeroParcelasMinimo(numeroParcelasMinimo);
            taxaJuros.setTaxaJuros(valorTaxaJuros);
            taxaJuros.setValorTotalMaximo(valorTotalMaximo);
            taxaJuros.setValorTotalMinimo(valorTotalMinimo);

            em.persist(taxaJuros);
        }

    }


    public void alterarTaxaJuros(String codigoTaxa, Double valorTotalMinimo, Double valorTotalMaximo, Integer numeroParcelasMinimo, Integer numeroParcelasMaximo, Double valorTaxaJuros) {

        TaxaJuros taxaJuros = consultarTaxaJuros(codigoTaxa);

        if (taxaJuros != null) {
            taxaJuros.setNumeroParcelasMaximo(numeroParcelasMaximo);
            taxaJuros.setNumeroParcelasMinimo(numeroParcelasMaximo);
            taxaJuros.setTaxaJuros(valorTaxaJuros);
            taxaJuros.setValorTotalMaximo(valorTotalMaximo);
            taxaJuros.setValorTotalMinimo(valorTotalMinimo);

            em.merge(taxaJuros);

        }
    }


    public void excluirTaxaJuros(String codigoTaxa) {
        TaxaJuros taxaJuros = consultarTaxaJuros(codigoTaxa);
        em.remove(taxaJuros);
    }


    public TaxaJuros consultarTaxaJuros(String codigoTaxa) {
        Query query = em.createQuery("SELECT tj FROM TaxaJuros tj WHERE tj.codigoTaxa = :codigoTaxa");
        query.setParameter("codigoTaxa", codigoTaxa);
        TaxaJuros taxaJuros = null;

        try {

            taxaJuros = (TaxaJuros) query.getSingleResult();

        } catch (javax.persistence.NoResultException e) {
        }

        return taxaJuros;
    }


    public void determinarTaxaJurosCliente(Long numeroProposta) {
        CreditosConcedidos creditosConcedidos = consultarCreditosConcedidos(numeroProposta);

        Query query = em.createQuery("SELECT tj FROM TaxaJuros tj WHERE (:numeroParcelas BETWEEN tj.numeroParcelasMinimo and  tj.numeroParcelasMaximo) and (:valor BETWEEN tj.valorTotalMinimo and tj.valorTotalMaximo)");
        query.setParameter("numeroParcelas", creditosConcedidos.getNumeroParcelas());
        query.setParameter("valor", creditosConcedidos.getValorTotalConcedido());
        TaxaJuros taxaJuros = null;

        try {
            taxaJuros = (TaxaJuros) query.getSingleResult();
        } catch (javax.persistence.NoResultException e) {
        }


        creditosConcedidos.setTaxaJuros(taxaJuros);
        em.merge(creditosConcedidos);
    }


    public void excluirParcela(Parcela parcela) {
        Parcela p = em.find(Parcela.class, new Long(parcela.getId()));
        em.remove(p);
    }
}
